package com.itheima.controller;

import com.itheima.global.BusinessException;
import com.itheima.po.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
 * @Author Andy
 * @Description //TODO CommonController
 * @Date 2022/3/12 10:55 上午
 * @Version 1.0
 **/
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {
    /*
 上传文件需求:
 上传一个不大于2M的图片显示在前端页面
 步骤:
 1.点击上传图片选择不大于2M的图片插入并发送求情到服务端
 2.服务端判断图片大小如果大于2M则返回文件过大到前端图片大小不超过2M

仅能上传 PNG JPEG JPG类型图片
 3.如果不大于2M则继续获取图片的文件名并重新命名,覆盖原有文件名避免文件名重复
 4.如果目录不存在，则创建文件存放目录
 5.将图片保存到目录,指定文件名,同时响应到前端
 6.前端根据文件名下载图片
 10_000_000
  */
//    /common/upload
//    private final static String dir = "/Users/amos/Documents/385/reggie_take_out/image/";

    @Value("${reggie.img.dir}")
    private String dir;

    @PostMapping("/upload")
    public R<String> upload(MultipartFile file){
        long size = file.getSize() / 1024 / 1024;
        if (size > 2){
            throw new BusinessException("上传图片不能超过2M");
        }
        String originalFilename = file.getOriginalFilename();
//        xxx.后缀  xxx 后缀
        String[] split = originalFilename.split("\\.");
        String suffix = split[split.length - 1];
        List<String> suffixList = Arrays.asList("PNG", "JPEG", "JPG", "png", "jpeg", "jpg");
        if (!suffixList.contains(suffix)){
            throw new BusinessException("上传图片格式有误");
        }
//        md5 雪花算法 时间戳 随机数 UUID
        String newFileName = UUID.randomUUID().toString();

        File fileDir = new File(dir);
        if (!fileDir.exists()){
            fileDir.mkdirs();
        }
        try {
            file.transferTo(new File(dir + newFileName + "." + suffix));
        } catch (IOException e) {
            System.out.println("file error");
            log.error("file error", e);
        }

        return R.success(newFileName + "." + suffix);
    }

    @GetMapping("/download")
    public void download(String name, HttpServletResponse httpServletResponse){
//        1 读取文件
//        2 通过httpresponse形成输出流，返回给前端
        try {
            FileInputStream fileInputStream = new FileInputStream(new File(dir + name));
            ServletOutputStream outputStream = httpServletResponse.getOutputStream();
//            表明返回什么格式
            httpServletResponse.setContentType("image/jpeg");
//            输入流复制给输出流
            byte[] bytes = new byte[1024];
//            为-1表明读取结束
            while (fileInputStream.read(bytes)!=-1){
                outputStream.write(bytes);
                outputStream.flush();
            }
            fileInputStream.close();
            outputStream.close();
        } catch (Exception e) {
            log.error("download error", e);
        }
    }

//    1 读取文件到输入流
//    2 把文件输入流中的数据复制给httpresponse的输出流
//    3 设置一下，content-type 也就是后端返回给前端的文件格式
//    4 close

}
